/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.mapagay.entidades.endereco;

import br.com.mapagay.conexao.Conexao;
import br.com.mapagay.entidades.usuario.Entidade;
import br.com.mapagay.exceptions.EntidadeNaoEncontrada;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author Lauro
 */
public class Cidade extends Entidade {

    private String nome;
    private Estado estado;

    public Cidade() {
    }

    public Cidade(Integer id) throws EntidadeNaoEncontrada {
        super(id);
        buscar();
    }

    public Cidade(Integer id, String nome, Estado estado) {
        super(id);
        this.nome = nome;
        this.estado = estado;
    }

    //<editor-fold defaultstate="expanded" desc="Metodos CRUD.">
    protected boolean buscar() throws EntidadeNaoEncontrada {
        return buscar(null);
    }

    @Override
    protected boolean buscar(Connection conexao) throws EntidadeNaoEncontrada {
        boolean fecharConexao = conexao == null ? true : false;
        try {
            conexao = conexao == null ? Conexao.getConexao() : conexao;
            String sql = getSQLBuscarPorId();
            PreparedStatement query = conexao.prepareStatement(sql);
            query.setInt(1, this.getId());
            ResultSet result = query.executeQuery();
            if (result.next()) {
                this.setNome(result.getString("c.nome"));
                this.setEstado(new Estado(result.getInt("e.id"),
                        result.getString("e.nome"),
                        result.getString("e.uf"),
                        new Pais(result.getInt("p.id"),
                            result.getString("p.nome"),
                            result.getString("p.sigla"))));
            } else {
                throw new EntidadeNaoEncontrada();
            }
            if (fecharConexao) {
                Conexao.close(conexao, query, result);
            }
            return true;
        } catch (SQLException ex) {
            if (fecharConexao) {
                Conexao.close(conexao);
            }
            return false;
        }
    }

    @Override
    protected boolean inserir(Connection conexao) {
        boolean fecharConexao = conexao == null ? true : false;
        try {
            conexao = conexao == null ? Conexao.getConexao() : conexao;
            String sql = getSQLInsercao();
            PreparedStatement query = conexao.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            query.setString(1, this.getNome());
            query.setInt(2, this.getEstado().getId());
            query.executeUpdate();
            ResultSet result = query.getGeneratedKeys();
            result.first();
            int result_id = result.getInt(1);
            this.setId(result_id);
            if (fecharConexao) {
                Conexao.close(conexao, query, result);
            }
            return true;
        } catch (SQLException ex) {
            if (fecharConexao) {
                Conexao.close(conexao);
            }
            return false;
        }
    }

    @Override
    protected boolean atualizar(Connection conexao) {
        boolean fecharConexao = conexao == null ? true : false;
        try {
            conexao = conexao == null ? Conexao.getConexao() : conexao;
            String sql = getSQLAtualizacao();
            PreparedStatement query = conexao.prepareStatement(sql);
            query.setString(1, this.getNome());
            query.setInt(2, this.getEstado().getId());
            query.setInt(3, this.getId());
            query.executeUpdate();
            if (fecharConexao) {
                Conexao.close(conexao, query);
            }
            return true;
        } catch (SQLException ex) {
            if (fecharConexao) {
                Conexao.close(conexao);
            }
            return false;
        }
    }

    @Override
    protected boolean excluir(Connection conexao) {
        boolean fecharConexao = conexao == null ? true : false;
        try {
            conexao = conexao == null ? Conexao.getConexao() : conexao;
            String sql = getSQLExclusao();
            PreparedStatement query = conexao.prepareStatement(sql);
            query.setInt(1, this.getId());
            query.executeUpdate();
            if (fecharConexao) {
                Conexao.close(conexao, query);
            }
            return true;
        } catch (SQLException ex) {
            if (fecharConexao) {
                Conexao.close(conexao);
            }
            return false;
        }
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Metodos Getters & Setters.">
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Estado getEstado() {
        return estado;
    }

    public void setEstado(Estado estado) {
        this.estado = estado;
    }

    //</editor-fold>
    //<editor-fold defaultstate="collapsed" desc="Strings SQL.">
    private static String getSQLBuscarPorId() {
        StringBuilder sql = new StringBuilder();
        sql.append(" SELECT c.*, e.*, p.* ");
        sql.append(" FROM cidade c ");
        sql.append(" INNER JOIN estado e ON e.id = c.estado ");
        sql.append(" INNER JOIN pais p ON p.id = e.pais ");
        sql.append(" WHERE ");
        sql.append(" c.id = ? ");
        return sql.toString();
    }

    private static String getSQLInsercao() {
        StringBuilder sql = new StringBuilder();
        sql.append(" INSERT INTO cidade ( ");
        sql.append(" nome, ");
        sql.append(" estado ");
        sql.append(" ) VALUES ( ");
        sql.append(" ?,  ");
        sql.append(" ?  ");
        sql.append(" )  ");
        return sql.toString();
    }

    private static String getSQLAtualizacao() {
        StringBuilder sql = new StringBuilder();
        sql.append(" UPDATE cidade SET ");
        sql.append(" nome = ?, ");
        sql.append(" estado = ? ");
        sql.append(" WHERE ");
        sql.append(" id = ? ");
        return sql.toString();
    }

    private static String getSQLExclusao() {
        StringBuilder sql = new StringBuilder();
        sql.append(" DELETE FROM cidade ");
        sql.append(" WHERE ");
        sql.append(" id = ? ");
        return sql.toString();
    }
    //</editor-fold>
}
